package com.znf4.controller.util;

import java.util.Map;  
import java.util.HashMap;  
import java.util.Formatter;  
import java.util.UUID;  
import java.security.MessageDigest;  
import java.security.NoSuchAlgorithmException;  
import java.io.UnsupportedEncodingException;    
  
/** 
 * 微信分享接口的SHA1签名 
 * @author Administrator 
 * 
 */  
public class Sign {  
    public static void main(String[] args) {  
        String jsapi_ticket = "jsapi_ticket";  
  
        // 注意 URL 一定要动态获取，不能 hardcode  
        String url = "http://example.com";  
        Map<String, String> ret = sign(jsapi_ticket, url);  
        for (Map.Entry entry : ret.entrySet()) {  
            System.out.println(entry.getKey() + ", " + entry.getValue());  
        }  
    };  
  
    public static Map<String, String> sign(String jsapi_ticket, String url) {  
        Map<String, String> ret = new HashMap<String, String>();  
        String nonce_str = create_nonce_str();  
        String timestamp = create_timestamp();  
        String string1;  
        String signature = "";  
  
        //注意这里参数名必须全部小写，且必须有序  
        string1 = "jsapi_ticket=" + jsapi_ticket +  
                  "&noncestr=" + nonce_str +  
                  "&timestamp=" + timestamp +  
                  "&url=" + url;  
  
        try  
        {  
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");  
            crypt.reset();  
            crypt.update(string1.getBytes("UTF-8"));  
            signature = byteToHex(crypt.digest());  
        }  
        catch (NoSuchAlgorithmException e)  
        {  
            e.printStackTrace();  
        }  
        catch (UnsupportedEncodingException e)  
        {  
            e.printStackTrace();  
        }  
  
        ret.put("url", url);  
        ret.put("jsapi_ticket", jsapi_ticket);  
        ret.put("nonceStr", nonce_str);  
        ret.put("timestamp", timestamp);  
        ret.put("signature", signature);  
  
        return ret;  
    }  
  
    private static String byteToHex(final byte[] hash) {  
        Formatter formatter = new Formatter();  
        for (byte b : hash)  
        {  
            formatter.format("%02x", b);  
        }  
        String result = formatter.toString();  
        formatter.close();  
        return result;  
    }  
  
    private static String create_nonce_str() {  
        return UUID.randomUUID().toString();  
    }  
  
    private static String create_timestamp() {  
        return Long.toString(System.currentTimeMillis() / 1000);  
    }  
}  
